<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace app\system\model;
use app\system\api\LoginSessionApi;
use think\Model;

/**
 * 会员模型
 */
class UcenterMember extends Model{
	use \traits\model\Auto;
    /**
     * 账户是用户名注册的
     */
    const ACCOUNT_TYPE_USERNAME = 1;
    /**
     * 账户是邮箱注册的
     */
    const ACCOUNT_TYPE_EMAIL = 2;
    /**
     * 账户是手机注册的
     */
    const ACCOUNT_TYPE_MOBILE = 3;
    /**
     * 用户ID进行登录
     */
    const ACCOUNT_TYPE_UID = 4;


    //======来源

	/**
	 * 数据表前缀
	 * @var string
	 */
	protected $tablePrefix = UC_TABLE_PREFIX;

	/**
	 * 数据库连接
	 * @var string
	 */
	protected $connection = UC_DB_DSN;

	/* 用户模型自动验证 */
	/* 不生效 ? */
	protected $validate = array(
		/* 验证用户名 */
		array('username', '6,64', -1, self::EXISTS_VALIDATE, 'length'), //用户名长度不合法
		array('username', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), //用户名禁止注册
		array('username', '', -3, self::EXISTS_VALIDATE, 'unique'), //用户名被占用

		/* 验证密码 */
		array('password', '6,64', -4, self::EXISTS_VALIDATE, 'length'), //密码长度不合法

		/* 验证邮箱 */
		array('email', 'email', -5, self::EXISTS_VALIDATE), //邮箱格式不正确
		array('email', '1,32', -6, self::EXISTS_VALIDATE, 'length'), //邮箱长度不合法
		array('email', 'checkDenyEmail', -7, self::EXISTS_VALIDATE, 'callback'), //邮箱禁止注册
		array('email', '', -8, self::EXISTS_VALIDATE, 'unique'), //邮箱被占用

		/* 验证手机号码 */
		array('mobile', '/^1\d{10}$/', -9, self::EXISTS_VALIDATE), //手机格式不正确 TODO:
		array('mobile', 'checkDenyMobile', -10, self::EXISTS_VALIDATE, 'callback'), //手机禁止注册
		array('mobile', '', -11, self::EXISTS_VALIDATE, 'unique'), //手机号被占用
		// array('mobile', 'checkMobile', -11, self::EXISTS_VALIDATE, 'callback'), //手机号被占用
	);

	/* 用户模型自动完成 */
	protected $auto = array(
		array('password', 'think_ucenter_md5', self::MODEL_INSERT, 'function', UC_AUTH_KEY),
		array('reg_time', NOW_TIME, self::MODEL_INSERT),
		array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
		array('update_time', NOW_TIME ),
		array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
	);

	/**
	 * 检测用户名是不是被禁止注册
	 * @param  string $username 用户名
	 * @return boolean          true - 未禁用，false - 禁止注册
	 */
	protected function checkDenyMember($username){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 检测手机号是否存在
	 * @param  string  $mobile 手机号码
	 * @return boolean         true - 未禁用，false - 禁止注册
	 */

	// protected function checkMobile($mobile){
	// 	$where = [];
	// 	$where['mobile']   = $mobile;
	// 	$where['username'] = 'M'.$mobile;
	// 	$where['_logic']   = 'or';
	// 	return $this->where($where)->find() ? false:true;
	// }
	//
	/**
	 * 检测邮箱是不是被禁止注册
	 * @param  string $email 邮箱
	 * @return boolean       true - 未禁用，false - 禁止注册
	 */
	protected function checkDenyEmail($email){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 检测手机是不是被禁止注册
	 * @param  string $mobile 手机
	 * @return boolean        true - 未禁用，false - 禁止注册
	 */
	protected function checkDenyMobile($mobile){
		return true; //TODO: 暂不限制，下一个版本完善
	}

	/**
	 * 根据配置指定用户状态
	 * @return integer 用户状态
	 */
	protected function getStatus(){
		return true; //TODO: 暂不限制，下一个版本完善
	}



	/**
	 * 用户登录认证
	 * @param  string  $username 用户名
	 * @param  string  $password 用户密码
	 * @param  integer $type     用户名类型 （1-用户名，，3-手机，4-UID）
	 * @return integer           登录成功-用户ID，登录失败-错误编号
	 */
	public function login($username, $password, $type = 1){
		$map = [];
    if($type == 4){
      $map['id'] = $username;
    }elseif($type == 3){
      $map['mobile'] = $username;
    }else{
    	$map['username'] = $username;
    }
		/* 获取用户数据 */
		$user = $this->where($map)->find();
		if(is_array($user) && $user['status']){
			/* 验证用户密码 */
			if(think_ucenter_md5($password, UC_AUTH_KEY) === $user['password']){
				$this->updateLogin($user['id']); //更新用户登录信息
				return $user['id']; //登录成功，返回用户ID
			} else {
				return -2; //密码错误
			}
		} else {
			return -1; //用户不存在或被禁用
		}
	}

    /**
     * 添加登录session
     */
	public function addLoginSession($uid, $device_type = 'app')
    {
        $session_id = md5($uid.$device_type.NOW_TIME);
        $session_expire_time = C('login_session_expire_time');
        $login_info = ['login_ip'=>get_client_ip(),'ua'=>$_SERVER['HTTP_USER_AGENT']];
        //判断是否已登录其他端,app需要T掉APP端
        $api = new LoginSessionApi();
        if(in_array($device_type, ['ios', 'android'])){
            $api->delete(['uid' => $uid, 'login_device_type' => ['in', ['ios', 'android']]]);
            $data = [
                'uid' => $uid,
                'login_session_id' => $session_id,
                'update_time' => NOW_TIME,
                'create_time' => NOW_TIME,
                'expire_time' => NOW_TIME + $session_expire_time,
                'login_device_type' => $device_type,
                'login_info' => json_encode($login_info, JSON_UNESCAPED_UNICODE)
            ];

            $result = $api->add($data);

            return $session_id;
        }else{
            return '只记录APP端登录';
        }


    }

    /**
     * login by session
     */
    public function loginBySession($uid, $session_id)
    {
        $api = new LoginSessionApi();
        $map = ['uid' => $uid, 'login_session_id' => $session_id, 'expire_time' => ['GT', NOW_TIME]];
        $result = $api->getInfo($map);
        if($result['status']){
            if(empty($result['info'])){
                return ['status' => false, 'info' => 'code无效'];
            }else{
                return ['status' => true, 'info' => '登录成功'];
            }
        }else{
            return ['status' => false, 'info' => $result['info']];
        }
    }

	/**
	 * 获取用户信息
	 * @param  string  $uid         用户ID或用户名
	 * @param  boolean $is_username 是否使用用户名查询
	 * @return array                用户信息
	 */
	public function info($uid, $is_username = false){
		$map = [];
		if($is_username){ //通过用户名获取
			$map['username'] = $uid;
		} else {
			$map['id'] = $uid;
		}

		$user = $this->where($map)->field('id,username,email,mobile,status')->find();
		if(is_array($user) && $user['status'] == 1){
			return array($user['id'], $user['username'], $user['email'], $user['mobile']);
		} else {
			return -1; //用户不存在或被禁用
		}
	}

	/**
	 * 检测用户信息
	 * @param  string  $field  用户名
	 * @param  integer $type   用户名类型 1-用户名 3-手机号
	 * @return integer         错误编号
	 */
	public function checkField($field, $type = 1){
		// $data = [];
  	//   $data['username'] = $field;
		// return $this->create($data) ? 1 : $this->getError();
		if($type === 1){
			return $this->where(['username'=>$field])->find() ? 1 : 0;
		}else if($type === 2){
			return $this->where(['email'=>$field])->find() ? 1 : 0;
		}else if($type === 3){
			return $this->where(['mobile'=>'M'.$field])->find() ? 1 : 0;
		}else{
			return 0;
		}
	}

	/**
	 * 更改用户密码
	 * @param  integer $uid 用户ID
	 */
	public function updatePwd($uid,$password){
		$data = array(
			'id'       => $uid,
			'password' => think_ucenter_md5($password, UC_AUTH_KEY),
		);
		$this->save($data);
	}

	/**
	 * 更新用户登录信息
	 * @param  integer $uid 用户ID
	 */
	protected function updateLogin($uid){
		$data = array(
			'id'              => $uid,
			'last_login_time' => NOW_TIME,
			'last_login_ip'   => get_client_ip(1),
		);
		$this->save($data);
	}

	/**
	 * 更新用户信息
	 * @param int $uid 用户id
	 * @param string $password 密码，用来验证
	 * @param array $data 修改的字段数组
	 * @return true 修改成功，false 修改失败
	 * @author huajie <banhuajie@163.com>
	 */
	public function updateUserFields($uid, $password, $data){

		if(empty($uid) || empty($password) || empty($data)){
			$this->error = '参数错误！';
			return false;
		}
		//更新前检查用户密码
		if(!$this->verifyUser($uid, $password)){
			$this->error = '验证出错：密码不正确！';
			return false;
		}
		//更新用户信息
		$data = $this->create($data);
		if($data){
			return $this->where(array('id'=>$uid))->save($data);
		}
		return false;
	}

	/**
	 * 验证用户密码
	 * @param int $uid 用户id
	 * @param string $password_in 密码
	 * @return true 验证成功，false 验证失败
	 * @author huajie <banhuajie@163.com>
	 */
	protected function verifyUser($uid, $password_in){
		$password = $this->where(array('id'=>$uid))->getField('password');
		if(think_ucenter_md5($password_in, UC_AUTH_KEY) === $password){
			return true;
		}
		return false;
	}

}
